#ifndef _MEPA_H_
#define _MEPA_H_

#include <iostream>
#include <string>
#include <fstream>


struct MepaLinha
{
    int  endereco;
    char instrucao[5];
    char *parametro1;
    char *parametro2;
    char *rotulo;
};

class Mepa
{
    public:

        Mepa(char *fileEntrada, char *saida, int tamanhoPrograma, int tamanhoMemoria, int tamanhoRegistrador);
        ~Mepa();

        char * preencheZero(int numero);
        void executar();
        void carregarCodigo();
        void parsearLinha(char *buffer, int index);
        void exibirCodigo();
        void alocaParametro(struct MepaLinha *linha, char *parametro);
        void setTopoMemoria(int valor);
        void setProximaInstrucao(int valor);
        void formataImpressao(char * string, char caracter, int tamanho, char alinhamento);
        void formataImpressao(int numero, char caracter, int tamanho, char alinhamento);
        void formataImpressao(std::ofstream &f, int numero, char caracter, int tamanho, char alinhamento);
        
        void INPP();
        void AMEM(int n);
        void DMEM(int n);
        void ARMZ(int k, int n);
        void MOSM();
        void DSVS(char * p);
        void DSVF(char * p);
        void NADA();
        void IMPL();
        void IMPC();
        void IMPR();
        void LEIT();
        void CRCT(int k);
        void CRVL(int k, int n);
        void SOMA();
        void SUBT();
        void MULT();
        void DIVI();
        void INVR();
        void CONJ();
        void DISJ();
        void NEGA();
        void CMME();
        void CMMA();
        void CMIG();
        void CMDG();
        void CMEG();
        void CMAG();
        void CHPR(char * L);
        void ENPR(int k);
        void RTPR(int k, int n);
        void CRVI(int k, int n);
        void ARMI(int k, int n);
        void CREN(int k, int n);

    private:

        std::ifstream mFileEntrada;
        char          mFileSaida[40];
        int           numLinhas;
        MepaLinha     *mPrograma;
        int           *mMemoria;
        int           *mRegistrador;
        int           mTamanhoMemoria;
        int           mTamanhoRegistrador;
        int           mTamanhoPrograma;
        int           mProximaInstrucao;   // i
        int           mTopoMemoria;        // s
        bool          mGerarArquivo;
};

#endif //_MEPA_H_
